package com.zgw.his.design.model.widgets;

import java.util.List;

import org.eclipse.wb.core.gef.command.EditCommand;
import org.eclipse.wb.core.gef.policy.PolicyUtils;
import org.eclipse.wb.core.gef.policy.validator.LayoutRequestValidators;
import org.eclipse.wb.gef.core.Command;
import org.eclipse.wb.gef.core.EditPart;
import org.eclipse.wb.gef.core.policies.ILayoutRequestValidator;
import org.eclipse.wb.gef.core.requests.ChangeBoundsRequest;
import org.eclipse.wb.gef.core.requests.CreateRequest;
import org.eclipse.wb.gef.core.requests.Request;
import org.eclipse.wb.gef.graphical.policies.LayoutEditPolicy;
import org.eclipse.wb.internal.core.model.JavaInfoUtils;
import org.eclipse.wb.internal.swt.model.widgets.ControlInfo;

public class DatasetEditPolicy extends LayoutEditPolicy {
	private static final ILayoutRequestValidator VALIDATOR = LayoutRequestValidators
			.modelType(DatasetItemInfo.class);
	private final DatasetInfo m_dataset;

	// //////////////////////////////////////////////////////////////////////////
	//
	// Constructor
	//
	// //////////////////////////////////////////////////////////////////////////
	public DatasetEditPolicy(DatasetInfo dataset) {
		m_dataset = dataset;
	}

	// //////////////////////////////////////////////////////////////////////////
	//
	// Requests
	//
	// //////////////////////////////////////////////////////////////////////////
	@Override
	protected ILayoutRequestValidator getRequestValidator() {
		return VALIDATOR;
	}

	// //////////////////////////////////////////////////////////////////////////
	//
	// Feedback
	//
	// //////////////////////////////////////////////////////////////////////////
	@Override
	protected void showLayoutTargetFeedback(Request request) {
		PolicyUtils.showBorderTargetFeedback(this);
	}

	@Override
	protected void eraseLayoutTargetFeedback(Request request) {
		PolicyUtils.eraseBorderTargetFeedback(this);
	}

	// //////////////////////////////////////////////////////////////////////////
	//
	// Commands
	//
	// //////////////////////////////////////////////////////////////////////////
	@Override
	protected Command getCreateCommand(CreateRequest request) {
		if (isValidTargetControl()) {
			final DatasetItemInfo iteminfo = (DatasetItemInfo) request
					.getNewObject();
			return new EditCommand(m_dataset) {
				@Override
				protected void executeEdit() throws Exception {
					JavaInfoUtils.add(iteminfo, null, m_dataset, null);
				}
			};
		}
		return null;
	}

	@Override
	protected Command getAddCommand(ChangeBoundsRequest request) {
		List<EditPart> editParts = request.getEditParts();
		if (isValidTargetControl() && editParts.size() == 1) {
			final DatasetItemInfo iteminfo = (DatasetItemInfo) editParts.get(0)
					.getModel();
			return new EditCommand(m_dataset) {
				@Override
				protected void executeEdit() throws Exception {
					JavaInfoUtils.move(iteminfo, null, m_dataset, null);
				}
			};
		}
		return null;
	}

	// //////////////////////////////////////////////////////////////////////////
	//
	// Utils
	//
	// //////////////////////////////////////////////////////////////////////////
	/**
	 * @return <code>true</code> if this {@link ControlInfo} can accept
	 *         {@link ControlDecorationInfo} .
	 */
	private boolean isValidTargetControl() {
		return true;
	}
}
